home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr28 / mxmnu239.zip / LOGIN.MNU < prev    next >
Text File  |  1993-03-22  |  23KB  |  928 lines

  1. Comment
  2. ========================================================
  3.  
  4. Copyright 1990-92 by Marc Perkel * All right reserved.
  5.  
  6. MarxMenu now allows you to login to a Novell network without using
  7. Novell's login program or messing with nasty login scripts. You can
  8. be in MarxMenu all the way in.
  9.  
  10. Before you start on this make sure you have read the Novell section of
  11. the MarxMenu manual. This menu is somewhat tricky and requires some
  12. study before you dive right in.
  13.  
  14. Logging into Novell is tricky. Especially if you are using boot roms
  15. on your network cards. Through much trial and error, I have found
  16. some solid tricks that make life easier.
  17.  
  18. You should have the following two BATCH files in your LOGIN
  19. directory as follows:
  20.  
  21. LOADNET.BAT  ;if used with BESTNET
  22. -----------
  23. @Echo Off
  24. %NET%
  25. %NETD%
  26. Set NET=
  27. Set NETD=
  28. Startup
  29.  
  30. LOADNET.BAT  ;if not used with BESTNET
  31. -----------
  32. @Echo Off
  33. NETX
  34. F:
  35. Startup
  36.  
  37. STARTUP.BAT
  38. -----------
  39. SET BOOTUP=LOGIN
  40. MarxMenu Login
  41. %BOOTUP%
  42.  
  43. Each workstation should have their own AUTOEXEC.BAT. The last line
  44. should be LOADNET. If you are running multiple versions of dos or a
  45. variety of computers you should run BESTNET as part of your bootup
  46. sequence.
  47.  
  48. Also, if you want automatic login you can add the following lines to you
  49. AUTOEXEC.BAT file:
  50.  
  51. SET USERNAME=MARC   Your Name Here
  52. SET PASSWORD=NERD   Your Password Here
  53.  
  54. You should also change the COMSPEC= to the network command.com BEFORE
  55. you run NETX. For some unknown reason, this solves a lot of problems.
  56.  
  57. Example:
  58.  
  59. IPX
  60. SET COMSPEC=O:COMMAMD.COM
  61. NETX
  62.  
  63. Another boot rom quirk is that you can't run any program off a boot
  64. rom that trashes upper memory. An example is running QEMM on a
  65. monochrome monitor.
  66.  
  67. By using this method the boot disk or boot rom hands control over in
  68. a clean way. LOADNET.BAT then branches to STARTUP.BAT for the rest
  69. of the login sequence.
  70.  
  71. For some strange reason which I can't explain, LOADNET and STARTUP
  72. have to be two separate batch files. I think it forces the transient
  73. part of COMMAND.COM to load into memory. Anyhow, don't combine these
  74. into one batch file
  75.  
  76. The first line of STARTUP.BAT is a message that tells this menu that
  77. the user is logging in for the first time. This menu creates a batch
  78. file and puts the name of it in the environment variable BOOTUP.
  79. STARTUP.BAT then executes this file.
  80.  
  81. This is the example for MY network. You'll have to modify it for
  82. yours. I'm doing a lot of tricky things in my login. Your login might
  83. not need to be as complex as mine.
  84.  
  85. One word of caution. After modifing this menu, always run MARXCOMP
  86. LOGIN to compile it. Otherwise, if you boot up into it you won't
  87. have enough access rights to recompile automatically. I do this by
  88. making a file called L.BAT.
  89.  
  90. ME LOGIN.MNU
  91. MARXCOMP LOGIN.MNU
  92.  
  93. ========================================================
  94. EndComment
  95.  
  96. var
  97.    UserName
  98.    OldPass
  99.    NewPass
  100.    Logged
  101.    Station
  102.    NetAddress
  103.    SmartDir
  104.    MyServer
  105.    OrigServer
  106.    HomeDir
  107.    DosDir
  108.    Shell
  109.    PasswordExpDays
  110.    SkipError
  111.    Servers
  112.    StatusWin
  113.    TsrLoaded
  114.    DrDos6
  115.    MyGroups
  116.  
  117. Comment
  118. ========================================================
  119.  
  120. If you are using 386 NetWare then you will have to add the following
  121. command to your AUTOEXEC.NCF file:
  122.  
  123. SET ALLOW UNENCRYPTED PASSWORDS = ON
  124.  
  125. ========================================================
  126. EndComment
  127.  
  128. Shell = CleanFileName(ReadEnv('COMSPEC'))
  129. MyServer = NovDefaultServer
  130. OrigServer = MyServer
  131. NovServers(Servers)
  132. Logged = ReadEnv('LOGGED') = 'TRUE'
  133.  
  134. SkipError = False
  135.  
  136. TryAutoLogin  ;login using environment variables
  137.  
  138. if not Logged then LoginFromScreen
  139.  
  140. NovSetPrimaryServer (MyServer)
  141. NovSetPreferredServer (MyServer)
  142.  
  143. NovReadGroups(UserName,MyGroups)    ;Read Groups user is in.
  144. SortArray(MyGroups)
  145.  
  146. UserName = NovMyLoginName
  147. SetEnv ('LOGGED=')
  148. SetEnv ('USERNAME=' + UserName)
  149. SetEnv ('PASSWORD=')
  150.  
  151. ;----- Another Server Selected
  152.  
  153. if MyServer <> OrigServer
  154.    SetEnv ('BOOTUP=STARTUP')
  155.    SetEnv ('LOGGED=TRUE')
  156.    NovMapDrive('F',MyServer + '/SYS:LOGIN')
  157.    ChDir('F:\LOGIN')
  158.    ExitMenu
  159. endif
  160.  
  161. ;----- You can't assume that you have an F: drive unless you map it.
  162.  
  163. NovMapDrive ('F','SYS:\LOGIN')
  164.  
  165. Comment
  166. ========================================================
  167.  
  168. If a TEMP environment variable is set, MarxMenu will use it for
  169. temporary batch files. This is compatible with DOS 5 and Windows
  170. conventions. The users should be given full access rights to this
  171. directory. I'm using \TMPFILES for my network.
  172.  
  173. ========================================================
  174. EndComment
  175.  
  176. if ExistDir('F:\TMPFILES') then SetEnv('TEMP=F:\TMPFILES')
  177.  
  178. ;----- Here we calculate a home directory for each user.
  179.  
  180. HomeDir = 'F:\HOME\' + UserName
  181. if UserName = 'SUPERVISOR' then HomeDir = 'F:\SYSTEM'
  182. if not ExistDir(HomeDir) then HomeDir = 'F:\PUBLIC\UTIL'
  183.  
  184. Comment
  185. ========================================================
  186.  
  187. Here we calulate the the name of the dos directory that matches the
  188. version of dos we are running. The directory for DOS 5.0 would be
  189. F:\PUBLIC\DOSV5.00
  190.  
  191. ========================================================
  192. EndComment
  193.  
  194. DosDir = 'F:\PUBLIC\DOSV' + DosVersionString
  195.  
  196. ;----- DR DOS (NovOS)
  197.  
  198. if ReadEnv('OS') > ''
  199.    DosDir = 'F:\PUBLIC\' + ReadEnv('OS') + ReadEnv('VER')
  200.    DrDos6 = Value(ReadEnv('VER')) >= 6
  201.    if DrDos6
  202.       Bat('SHARE.EXE')
  203.    endif
  204. endif
  205.  
  206. if not ExistDir(DosDir) then DosDir = ''
  207.  
  208. Comment
  209. ========================================================
  210.  
  211. Here's where we map our drives. This does not set the search path.
  212. You set that explicitly by writing to the PATH environment variable.
  213.  
  214. SYS:--+---PUBLIC---NSK
  215.       |     |
  216.       |     +------UTIL
  217.       |     |
  218.       |     +------DOSV5.00
  219.       |     |
  220.       |     +------DRDOS6.0
  221.       |
  222.       +---HOME-----MARC
  223.       |     |
  224.       |     +------VICKI
  225.       |
  226.       +---LOGIN
  227.  
  228. Drive map commands may contain server and volume referrences:
  229.  
  230. ========================================================
  231. EndComment
  232.  
  233. NovMapRoot ('H', HomeDir)           ;Home Directory
  234. NovMapRoot ('N','F:\PUBLIC\NSK')    ;Network Survival Kit
  235. NovMapRoot ('O', DosDir)            ;Dos Directory
  236. NovMapRoot ('U','F:\PUBLIC\UTIL')   ;Utilities Directory
  237. NovMapRoot ('P','F:\PUBLIC')        ;Public Directory
  238. NovMapRoot ('L','F:\LOGIN')         ;Login Directory
  239.  
  240. Comment
  241. ========================================================
  242.  
  243. Here we set a different directory for a program depending on if we
  244. have a color or monochrome monitor.
  245.  
  246. ========================================================
  247. EndComment
  248.  
  249. if VideoMode = Mono
  250.    SmartDir = 'F:\PUBLIC\MSMART'
  251. else
  252.    SmartDir = 'F:\PUBLIC\CSMART'
  253. endif
  254.  
  255. if ExistDir SmartDir
  256.    NovMapRoot ('S',SmartDir)
  257. endif
  258.  
  259. Comment
  260. ========================================================
  261.  
  262. W: is a work drive. When an application needs an extra search path, I
  263. move W: to that directory.
  264.  
  265.  OnKey 'L'
  266.    |NovMapRoot('W','\PUBLIC\LOTUS')
  267.    Lotus
  268.  
  269. ========================================================
  270. EndComment
  271.  
  272. NovMapRoot('W','H:')
  273.  
  274. if NovConsoleOperator
  275.    NovMapRoot ('V','F:\SYSTEM')     ;System Directory
  276. endif
  277.  
  278. if MyServer = 'TYME'
  279.  
  280.  
  281.    ;----- Here's where I log into a second server.
  282.  
  283.    if PosInList('TYME2',Servers) > 0
  284.       NovLogin('TYME2/' + UserName,OldPass)
  285.       NovMapDrive('K','TYME2/SYS:')
  286.    endif
  287.  
  288.    ;----- Here's where I log into a third server.
  289.  
  290.    if PosInList('TSS',Servers) > 0
  291.       NovLogin('TSS/' + UserName,OldPass)
  292.       NovMapDrive('J','TSS/SYS:')
  293.    endif
  294.  
  295.    ;----- Here's where I log into another server.
  296.  
  297.    if PosInList('MARX',Servers) > 0
  298.       NovLogin('MARX/' + UserName,OldPass)
  299.       NovMapDrive('G','MARX/SYS:')
  300.    endif
  301.  
  302. endif
  303.  
  304. if MyServer = 'MARX' then NovMapDrive ('I','VOL1:')
  305.  
  306. ;----- Turbo Pascal 6
  307.  
  308. if ExistDir ('H:\TP6') then NovMapRoot ('T','H:\TP6')
  309.  
  310. ;----- If no drive C then use home directory
  311.  
  312. if Floppies < 3                     ;I'm using some 4 floppy machines
  313.    if not ExistDir ('C:\') then NovMapRoot('C','H:')
  314. endif
  315.  
  316. ;----- Here we define our search paths.
  317.  
  318. SetEnv ('PATH=T:\;H:\;W:\;U:\;N:\;O:\;P:\;V:\;S:\;')
  319.  
  320. FixPath    ;Verifies all search paths exist
  321.  
  322. ChDir (HomeDir)
  323.  
  324. ;----- Here's where we set master environment variable strings
  325.  
  326. SetEnv ('STATION=' + Station)
  327. if Left(Shell,2) <> 'C:' and ExistFile('O:\COMMAND.COM')
  328.    SetEnv ('COMSPEC=O:\COMMAND.COM')
  329. endif
  330. SetEnv ('PROMPT=$e[1;33m$p: $e[0;32m')  ;ansi required
  331. SetEnv ('MXECHO=OFF')
  332. SetEnv ('MV=' + MyServer + '/SYS:')    ;MHS
  333.  
  334. ;----- Check for personal menu.
  335.  
  336. if ExistFile('H:\' + UserName + '.MNU')
  337.    SetEnv('PMENU=' + UserName + '.MNU')
  338. endif
  339.  
  340. ;----- Here's where I set up for Pick Directory
  341.  
  342. if UserName <> 'MARC'
  343.    SetEnv ('PD.EXE=/$F:\HOME\PD.PIC')
  344. else
  345.    SetEnv ('PD.EXE=/$H:\PD.PIC')
  346. endif
  347.  
  348. Comment
  349. ========================================================
  350.  
  351. Opens a semaphore that XMETER can read.
  352. To see how many users are users are on with XMETER type:
  353. XMETER LOGIN /U
  354.  
  355. ========================================================
  356. EndComment
  357.  
  358. NovOpenSemaphore ('XM-LOGIN',0)
  359.  
  360. ;----- Turn NumLock key on if in NumLock group.
  361.  
  362. if InGroup('NUMLOCK')
  363.    NumLock On
  364. else
  365.    NumLock Off
  366. endif
  367.  
  368. ;----- LOGIN is set to BOOTUP if logging in for the first time
  369.  
  370. if UpperCase(ReadEnv('BOOTUP')) <> 'LOGN' then ExitMenu
  371.  
  372. Comment
  373. ========================================================
  374.  
  375. In order to load TSRs, MarxMenu writes a temporary batch file and
  376. exits. The STARTUP.BAT file then jumps to this batch file.
  377.  
  378. ========================================================
  379. EndComment
  380.  
  381. ;----- Create temporary batch file for rest of login sequence
  382.  
  383. SetEnv ('BOOTUP=' + BatFileName)
  384.  
  385. ;----- To debug, set ECHO ON and add PAUSE commands
  386.  
  387. if DosVersionString < '3.30'
  388.    Bat('ECHO OFF')
  389. else
  390.    Bat('@ECHO OFF')
  391. endif
  392.  
  393. Bat ('SET BOOTUP=')     ;clear BOOTUP environment variable
  394.  
  395. ;----- Set BREAK to ON if NovConsoleOperator
  396.  
  397. if NovConsoleOperator then Bat('BREAK ON')
  398.  
  399. Comment
  400. ========================================================
  401.  
  402. Here's where we load up all the TSRs the user is going to use. We set
  403. the environment variable TSR to Y to indicate that TSRs are loaded. This
  404. way if we log out and then back in we won't load them twice.
  405.  
  406. ========================================================
  407. EndComment
  408.  
  409. TsrLoaded = ReadEnv('TSR') = 'Y'
  410.  
  411. if not TsrLoaded
  412.  
  413.    SetEnv ('TSR=Y')
  414.  
  415.    ;----- Load CastAway
  416.  
  417.    if InGroup ('CASTAWAY')
  418.       Bat ('P:\EXPR\CASTAWAY N /W=0 /I=0 /H')
  419.    endif
  420.  
  421.    ;----- Load BRequest
  422.  
  423.    if InGroup ('BREQ')
  424.       Bat (LoadHigh + 'BREQUEST')
  425.    endif
  426.  
  427.    ;----- Load ExpressIT Mail System
  428.  
  429.    if InGroup ('EXPRESSIT')
  430.       Bat ('P:\EXPR\EXPRESSM F12')
  431.    endif
  432.  
  433.    ;----- Load Lan Assist
  434.  
  435.    if InGroup ('LANASSIST')
  436.       if InGroup ('LA-RES')
  437.          Bat (LoadHigh + 'P:LA\LA /L >NUL')
  438.       else
  439.          Bat (LoadHigh + 'P:LA\LA +N >NUL')
  440.       endif
  441.    endif
  442.  
  443.    ;----- Load SideKick if in Sidekick Group
  444.  
  445.    if InGroup('SIDEKICK')
  446.       Bat ('KBD CR')
  447.       Bat (LoadHigh + 'SWAPSK/N/G/D' + HomeDir + ' >NUL')
  448.       Bat ('SK')
  449.       Bat ('CLS')
  450.    endif
  451.  
  452.    ;----- Load SideKick 2 if in SK2 Group
  453.  
  454.    if (InGroup('SK2')) and not DrDos6
  455.       Bat (LoadHigh + 'P:\SK2\SK2')
  456.    endif
  457.  
  458.    ;----- Dr Dos 6
  459.  
  460.    if DrDos6 and InGroup('TASKMAX')
  461.       Bat('TaskMax')
  462.    endif
  463.  
  464.    ;----- Load MarxPop
  465.  
  466.    if InGroup('MARXPOP') and not DrDos6
  467.       Bat('MarxPop H:MarxPop.cfg')
  468.    endif
  469.  
  470. endif
  471.  
  472. Capture('LASER',2)
  473.  
  474. Comment
  475. ================================================================
  476.  
  477. This next section deals with running special programs bases on the
  478. physical station number rather than by user. This deals with special
  479. hardware that needs software drivers loaded.
  480.  
  481. ================================================================
  482. EndComment
  483.  
  484. ;----- CD ROM Machine
  485.  
  486. ;if NetAddress = '255:2'
  487. ;   Bat ('CD\PUBLIC\MA')
  488. ;   Bat ('MSCDEX.EXE /D:MSCD003 /M:12')
  489. ;   Bat ('MAR C:\ RW=/ /C')
  490. ;endif
  491.  
  492. if NetAddress = '254:93'
  493. ;   TextMode Mono
  494. endif
  495.  
  496. ;----- Set Keyboard Speed Faster if 286 or greater.
  497.  
  498. if CPUClass > 1 then Bat('KBD 6')
  499.  
  500. Comment
  501. ================================================================
  502.  
  503. This next section deals with running special programs bases on the
  504. users preferrences.
  505.  
  506. ================================================================
  507. EndComment
  508.  
  509. if UserName = 'MARC'
  510.    Capture('DOT',1)
  511.    ChDir('TP6')
  512. endif
  513.  
  514. if UserName = 'VICKI'
  515. ;   if not TsrLoaded then Bat(LoadHigh + 'MOUSE')
  516. endif
  517.  
  518. if UserName = 'KEVIN'
  519.    Capture('DOT',2)
  520.    SetEnv('PROMPT=($p)')
  521.    SetEnv('PATH=' + ReadEnv( 'Path' ) + ';f:\home\kevin\brief' )
  522.    ChDir('MARX')
  523. endif
  524.  
  525. if UserName = '386'
  526.    Capture('DOT',1)
  527. endif
  528.  
  529. if UserName = 'TBBS'
  530.    Capture('DOT',1)
  531.    ChDir('F:\BBS\TBBS')
  532.    NovMapDrive('H','F:')
  533.    SetEnv('D.EXE=/O/I')
  534.    Bat('DROPTO R1')
  535. endif
  536.  
  537. if UserName = 'GRACE'
  538.    Bat('KBD 6 NumOn');
  539. endif
  540.  
  541. if UserName = 'WORK'
  542.    Capture('DOT',1)
  543. endif
  544.  
  545. if UserName = 'MHS'
  546.    Capture('DOT',1)
  547.    ChDir('F:\MHS\EXE')
  548.    NovMapDrive('H','F:')
  549.    Bat('MHSNOTFY')
  550.    Bat('MHSRESET')
  551.    Bat('DROPTO MHS')
  552. endif
  553.  
  554. if UserName = 'FAX'
  555.    Bat(LoadHigh + 'P:\MAPA\MAHOST D:\ -1 TINY')
  556.    Capture('DOT',1)
  557.    NovMapRoot('W','H:\INTEL\FAXPAK')
  558.    SetEnv('PATH=H:\INTEL;' + ReadEnv('PATH'))
  559.    ChDir('F:\HOME\FAX\INTEL')
  560.    Bat(LoadHigh + 'CASMGR.EXE CASMGR.CFG')
  561.    Bat(LoadHigh + 'FAXPOP.EXE')
  562.    if AfterHours
  563.       BAT('CD\PUBLIC\AWHOST')
  564.       BAT('AWHOST -M=W')
  565.       BAT('BATEXIT')
  566.    else
  567.       BAT('DROPTO MARXMENU FAXSERV')
  568.       BAT('BATEXIT')
  569.    endif
  570. endif
  571.  
  572.  
  573. Comment
  574. ================================================================
  575.  
  576. The batch file ends by jumping to personal menu, if there is one, or
  577. the default menu if there isn't. DROPTO.BAT is used to erase the
  578. temporary batch file that this menu creates.
  579.  
  580. ================================================================
  581. EndComment
  582.  
  583. if DrDos6 and InGroup('TASKMAX')
  584.    Bat ('DROPTO MARXMENU NOVMAX')
  585. endif
  586.  
  587. if ExistFile ('F:\HOME\' + UserName + '\' + UserName + '.MNU')
  588.    Bat ('DROPTO MARX ' + UserName)
  589. endif
  590.  
  591. Bat ('DROPTO MARX TYME')
  592.  
  593. ExitMenu
  594.  
  595. ;===============================================================
  596. ;===============================================================
  597.  
  598. ;----- Procedure Definitions
  599.  
  600. Procedure Capture (Queue, PrinterPort)
  601.    NovCaptureQueue(PrinterPort) = Queue
  602.    NovCaptureTimeOut(PrinterPort) = 5     ;5 second timeout
  603. EndProc
  604.  
  605.  
  606. Procedure LoadHigh
  607.    if ReadEnv('OS2') = 'Y'
  608.       Return 'LOADHIGH '
  609.    else
  610.       Return 'P:\QEMM\LOADHI.COM '
  611.    endif
  612. EndProc
  613.  
  614.  
  615. Comment
  616. ========================================================
  617.  
  618. If Environment variables USERNAME and PASSWORD are set, this menu
  619. will attempt to log into the network using these values. This allows
  620. for automatic login. You can also pass the parameters on the command
  621. line as follows.
  622.  
  623. MarxMenu Login <Name> <Password>
  624.  
  625. The name may contain a referrence to a server: Server/Name
  626.  
  627. ========================================================
  628. EndComment
  629.  
  630. ;----- Try Automatic Login using Environment Variables
  631.  
  632. Procedure TryAutoLogin
  633.    if Logged then Return
  634.    if CapsLock
  635.       CapsLock Off
  636.    else
  637.       UserName = ParamStr(2)
  638.       if UserName = '' then UserName = ReadEnv('USERNAME')
  639.       if UserName > ''
  640.          OldPass = ParamStr(3)
  641.          if OldPass = '' then OldPass = ReadEnv('PASSWORD')
  642.          SkipError = True
  643.          Login (UserName,OldPass)
  644.          SkipError = False
  645.          if PasswordNeedsChanged
  646.             Logged = False
  647.             Suggest 'C'
  648.          endif
  649.       endif
  650.    endif
  651. EndProc
  652.  
  653. ;----- Select colors and prepare screen
  654.  
  655. Procedure LoginFromScreen
  656.    if ColorScreen
  657.       TextColor White Red
  658.       BoxBorderColor Green Brown
  659.       BoxInsideColor Black Brown
  660.       ClearScreen 176
  661.       ClockColor Black Brown
  662.       TextColor Black Green
  663.       BoxHeaderColor Yellow Mag
  664.       Shadow
  665.    else
  666.       TextColor Grey Black
  667.       ClearScreen 176
  668.       TextColor Black Grey
  669.       BoxBorderColor Black Grey
  670.       BoxInsideColor Black Grey
  671.       BoxHeaderColor Black Grey
  672.       ClockColor Black Grey
  673.    endif
  674.    BlankMessage = 'Netware Login'
  675.    ClockMode = 262
  676.    GotoXY 1 25
  677.    ClearLine
  678.    WriteCenter "Computer Tyme Master Network Login Menu"
  679.    SingleLineBox
  680.    Explode Off
  681.    ShadowColor Grey Red
  682.    if ColorScreen
  683.       DrawBox 3 2 74 5
  684.       ClockPos 42 5
  685.       TextColor Blue Brown
  686.    else
  687.       DrawBox 3 2 76 5
  688.       ClockPos 44 5
  689.    endif
  690.    WriteCenter 'Computer Tyme Software Development Laboratory'
  691.    Writeln
  692.    TextColor Black Brown
  693.    WriteCenter '───────────────────────────────────────────────────────'
  694.    Writeln
  695.    TextColor Black Brown
  696.    Write "  (C) 1990-92 by Marc Perkel"
  697.    DoubleLineBox
  698.    BlankTime = 10
  699.  
  700.    Explode On
  701.    BlockBox
  702.    BoxBorderColor Green Blue
  703.    BoxInsideColor Yellow Blue
  704.    BoxHeader = " Station Information "
  705.    if ColorScreen
  706.       DrawBox 39 17 38 6
  707.       TextColor Yellow Blue
  708.    else
  709.       DrawBox 41 17 38 6
  710.       TextColor Grey Black
  711.    endif
  712.    StatusWin = CurrentWindow
  713.    UpdateStatusWindow
  714.  
  715.    ChooseOption
  716.  
  717.    EraseTopWindow
  718.    EraseTopWindow
  719.    EraseTopWindow
  720.    TextColor Grey Black
  721.    ClearScreen
  722. EndProc
  723.  
  724.  
  725. Procedure ChooseOption
  726. var Ch X
  727.    repeat
  728.       X = 4
  729.       if NumberOfElements(Servers) > 1 then X = 5
  730.       DrawBox 3 17 26 X
  731.       UseArrows
  732.       OnScreenOnly
  733.       InverseColor Yellow Cyan
  734.       Writeln '  L - Login to Network'
  735.       Write   '  C - Change Password'
  736.       if NumberOfElements(Servers) > 1
  737.          Writeln
  738.          Write   '  S - Select Server'
  739.       endif
  740.       Ch = UpperCase(ReadKey)
  741.       if (Ch = 'L') or (Ch = 'C') or (Ch = 'S')
  742.          EraseTopWindow
  743.          if Ch = 'L'
  744.             LoginToNetwork (False)
  745.          endif
  746.          if Ch = 'C'
  747.             LoginToNetwork (True)
  748.          endif
  749.          if Ch = 'S'
  750.             SelectServer
  751.          endif
  752.       endif
  753.    until Logged
  754. EndProc
  755.  
  756.  
  757. Procedure Warning (St)
  758.    BoxHeader ' Warning '
  759.    DrawBox 3 17 length(St) + 4 3
  760.    Write Char(7) ' ' St
  761.    Wait 300
  762.    EraseTopWindow
  763. EndProc
  764.  
  765.  
  766. Procedure LoginToNetwork (CP)
  767. var NewPassVerify
  768.    BoxHeader = ' Logging into Server * ' + MyServer + ' '
  769.    DrawBox 3 10 50 4
  770.    UseArrows Off
  771.    Security
  772.    repeat
  773.       if UserName = ''
  774.          Write ' Name: '
  775.          UserName = UpperCase(Readln)
  776.          Writeln
  777.       endif
  778.       SkipError = True
  779.       Login (UserName,'')      ;try no password
  780.       SkipError = False
  781.       if not Logged
  782.          Write ' Password: '
  783.          OldPass = UpperCase(Readln)
  784.          Write CR
  785.          ClearLine
  786.          Login (UserName,OldPass)
  787.       endif
  788.       if not CP
  789.          CP = PasswordNeedsChanged
  790.          if CP then Warning('Time to change your password!')
  791.       endif
  792.       if CP
  793.          if LastKey <> Esc
  794.             repeat
  795.                Write ' New Password: '
  796.                NewPass = UpperCase(Readln)
  797.                Write CR
  798.                ClearLine
  799.                if NewPass = OldPass then Warning('Select a NEW Password!')
  800.             until NewPass <> OldPass
  801.          endif
  802.          if LastKey <> Esc
  803.             Write ' Verify: '
  804.             NewPassVerify = UpperCase(Readln)
  805.             Write CR
  806.             ClearLine
  807.             if NewPass = NewPassVerify
  808.                NovChangePassword (OldPass,NewPass)
  809.                if NovResult <> 0
  810.                   Warning ('Password Change Failed!')
  811.                   Logged = False
  812.                endif
  813.             else
  814.                Warning('Password Typed Wrong!')
  815.                Logged = False
  816.             endif
  817.          endif
  818.       endif
  819.    ClearScreen
  820.    if not Logged
  821.       UserName = ''
  822.    endif
  823.    until (LastKey = Esc) or Logged
  824.    EraseTopWindow
  825. EndProc
  826.  
  827.  
  828. Procedure Login (User, Pass)
  829.    NovLogin (MyServer + '/' + User, Pass)
  830.    if NovResult = 223 then NovResult = 0  ;grace login
  831.    Logged = NovResult = 0
  832.    if Logged
  833.       NovMapDrive('F',MyServer + '/SYS:LOGIN')
  834.    endif
  835.    if not Logged and not SkipError
  836.  
  837.       if NovResult = 254
  838.          Warning('All Logins Disabled!')
  839.  
  840.       elseif NovResult = 222
  841.          Warning('Password Expired!')
  842.  
  843.       elseif NovResult = 252
  844.          Warning('Invalid User Name!')
  845.  
  846.       elseif NovResult = 220
  847.          Warning('Account Disabled!')
  848.  
  849.       elseif (NovResult = 218) or (NovResult = 219)
  850.          Warning('Invalid Login Time!')
  851.  
  852.       elseif NovResult = 197
  853.          Warning('Intruder Lockout!')
  854.  
  855.       elseif NovResult = 255
  856.          Warning('Bad Password!')
  857.  
  858.       else
  859.          Warning('Login Failed! '+ Str(NovResult))
  860.  
  861.       endif
  862.  
  863.    endif
  864. EndProc
  865.  
  866.  
  867. Procedure PasswordNeedsChanged
  868. var X
  869.    X = NovPasswordExpDate (UserName)
  870.    if X = 0 then Return False
  871.    Return (X - Today) / SecondsInDay <= 5
  872. EndProc
  873.  
  874.  
  875. Procedure SelectServer
  876. var St
  877.    DrawBox 25 9 20 Min(NumberOfElements (Servers) + 2,10)
  878.    St = PickOne (Servers)
  879.    if St = '' then Return
  880.    MyServer = St
  881.    NovSetPrimaryServer (MyServer)
  882.    NovSetPreferredServer (MyServer)
  883.    EraseTopWindow
  884.    UpdateStatusWindow
  885. EndProc
  886.  
  887.  
  888. Procedure UpdateStatusWindow
  889.    SetTopWindow StatusWin
  890.    ClearScreen
  891.    NetAddress = NovStationAddress (NovConnection)
  892.    Station = Str(NovConnection)
  893.    while length(Station) < 3
  894.       Station = '0' + Station
  895.    endwhile
  896.    Writeln '           Server: ' MyServer
  897.    Writeln '          Network: ' NetAddress
  898.    Writeln '       Connection: ' Station
  899.    Write   '      DOS Version: ' DosVersionString
  900.    if StatusWin <> CurrentWindow
  901.       SetWindowUnder (StatusWin,StatusWin + 1)
  902.    endif
  903. EndProc
  904.  
  905. ;----- Returns True if in list
  906.  
  907. Procedure InGroup (Group)
  908.    Return PosInSortedList(UpperCase(Group),MyGroups) > 0
  909. EndProc
  910.  
  911. ;----- Return True if after hours
  912.  
  913. Procedure AfterHours
  914.    Return (DayOfWeek = Sun) or (DayOfWeek = Sat) or (Hour > 17) or (Hour < 7)
  915. EndProc
  916.  
  917. ;----- Show Item for Debugging
  918.  
  919. Procedure ShowMe (Item)
  920.    DrawBox 1 23 80 3
  921.    Write ' '
  922.    TextColor Yellow Cyan
  923.    Write Item
  924.    Wait 300
  925.    EraseTopWindow
  926. EndProc
  927.  
  928.